const { ConcatSource } = require('webpack-sources');
class RemoveLogs {
  constructor(options = {}) {
    // 是否移除console.log，默认为true
    this.removeConsole =
      options.removeConsole !== undefined ? options.removeConsole : true;
  }
  apply(compiler) {
    // 使用 compilation 插件，处理每个模块的源代码
    compiler.hooks.compilation.tap('RemoveConsolePlugin', (compilation) => {
      compilation.hooks.optimizeChunkAssets.tap(
        'RemoveConsolePlugin',
        (chunks) => {
          chunks.forEach((chunk) => {
            chunk.files.forEach((file) => {
              let source = compilation.assets[file].source();
              if (this.removeConsole) {
                const regex = /console\.log\s*\([^;]*\);?/g;
                source = source.replace(regex, '');

                // if (source.indexOf('console') !== -1) {
                //   console.log('source', source);
                // }
              }

              // 替换原来的源代码
              compilation.assets[file] = new ConcatSource(source);
            });
          });
        }
      );
    });

    // 去除注释正则
    // const reg =
    //   /("([^\\\"]*(\\.)?)*")|('([^\\\']*(\\.)?)*')|(\/{2,}.*?(\r|\n))|(\/\*(\n|.)*?\*\/)|(\/\*\*\*\*\*\*\/)/g;

    // compiler.hooks.emit.tapAsync('RemoveComment', (compilation) => {
    //   // 遍历构建产物，.assets中包含构建产物的文件名
    //   Object.keys(compilation.assets).forEach((item) => {
    //     // .source()是获取构建产物的文本
    //     let content = compilation.assets[item].source();
    //     if (Object.prototype.toString.call(content) === '[object String]') {
    //       content = content?.replace(reg, function (word) {
    //         // 去除注释后的文本
    //         return /^\/{2,}/.test(word) ||
    //           /^\/\*!/.test(word) ||
    //           /^\/\*{3,}\//.test(word)
    //           ? ''
    //           : word;
    //       });
    //     }

    //     // // 更新构建产物对象
    //     compilation.assets[item] = {
    //       source: () => content,
    //       size: () => content.length,
    //     };
    //   });
    // });
  }
}

module.exports = RemoveLogs;
